package controller.priv;

import controller.MyCoolServlet;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.*;
import javax.servlet.http.*;
import model.Product;
import persistence.product.ProductDAO;
import persistence.product.ProductPersistFactory;

public class UpdateServlet extends MyCoolServlet {

    @Override
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ProductDAO persistenceManager = ProductPersistFactory.getProductDAO(persistenceMechanism);
        String modificar = request.getParameter("modificar");
        String updateNombre = request.getParameter("updateNombre");
        String updateSo = request.getParameter("updateSo");
        Map<String, Product> productArray = new HashMap<String, Product>();
        Product product;
        if (modificar.equals("false")) {
            persistenceManager.readProduct(updateNombre + "_" + updateSo, productArray);
            if (productArray.size() > 0) {
                request.setAttribute("product", productArray.get(updateNombre + "_" + updateSo));
                gotoURL(updateForm2, request, response);
            } else {
                request.setAttribute("message1", "Error al actualizar app:");
                request.setAttribute("message2", "Es posible que no exista dicha app");
                gotoURL(errorForm, request, response);
            }
        } else {
            product = generateProductFromRequest(request);
            String errorString = validarCampos(product);
            if (errorString.equals("") && persistenceManager.updateProduct(updateNombre + "_" + updateSo, product)) {
                request.setAttribute("product", product);
                request.setAttribute("message", "App modificada en la tienda");
                gotoURL(successForm, request, response);
            } else {
                if (errorString.equals("")){
                    request.setAttribute("message1", "Error al actualizar app:");
                    request.setAttribute("message2", "Es posible que esa app ya exista");
                }
                else {
                    request.setAttribute("message1", "Error al validar");
                    request.setAttribute("message2", errorString);
                }
                gotoURL(errorForm, request, response);
            }
        }
    }

    Product generateProductFromRequest(HttpServletRequest request) throws NumberFormatException {
        Product product = new Product();
        String nombre = (String) request.getAttribute("nombre");
        String precioString, descripcionc, descripcionl, so;
        int ventas;
        ventas = Integer.parseInt(request.getParameter("ventas"));
        nombre = request.getParameter("nombre");
        precioString = request.getParameter("precio");
        descripcionc = request.getParameter("descripcionc");
        descripcionl = request.getParameter("descripcionl");
        so = request.getParameter("so");
        String fecha = getFechaActual();
        String usuario = request.getParameter("usuario");

        product.setId(precioString);
        product.setNombre(nombre);
        product.setDescripcionc(descripcionc);
        product.setDescripcionl(descripcionl);
        product.setSo(so);
        product.setVentas(ventas);
        product.setFecha(fecha);
        product.setUsuario(usuario);


        return product;
    }

    public String validarCampos(Product product) {
        String errorString = "";

        if (!validarNombre(product.getNombre())) {
            errorString += "Nombre ";
        }
        if (!validarPrecio(product.getId())) {
            errorString += "Precio ";
        } else {
            Float precio = Float.parseFloat(product.getId());
            product.setPrecio(precio);
        }
        if (!validarDescripcionc(product.getDescripcionc())) {
            errorString += "Descripcion Corta ";
        }
        if (!validarDescripcionl(product.getDescripcionl())) {
            errorString += "Descripcion Larga ";
        }
        if (errorString.equals("")) {
            product.setId(product.getNombre() + "_" + product.getSo());
            return errorString;
        } else {
            return "Parametros incorrectos: " + errorString;
        }
    }

    private boolean validarNombre(String nombre) {
        boolean isGoodLength = checkLength(nombre, 1, 50);
        return nombre.matches("([a-zA-Z0-9ñÑáéíóúÁÉÍÓÚ ])*") && isGoodLength;
    }

    private boolean validarPrecio(String precio) {
        boolean isGoodLength = checkLength(precio, 1, 10);
        return (precio.matches("([0-9])*.([0-9])*") || precio.matches("([0-9])*")) && isGoodLength;
    }

    private boolean validarDescripcionc(String descripcionc) {
        boolean isGoodLength = checkLength(descripcionc, 1, 140);
        return (!descripcionc.contains("<") && !descripcionc.contains(">")) && isGoodLength;
    }

    private boolean validarDescripcionl(String descripcionl) {
        boolean isGoodLength = checkLength(descripcionl, 1, 750);
        return (!descripcionl.contains("<") && !descripcionl.contains(">")) && isGoodLength;
    }

    private boolean checkLength(String data, int minAceptable, int maxAceptable) {
        int length = data.length();
        boolean isGoodLength = length >= minAceptable && length <= maxAceptable;
        return isGoodLength;
    }

    private static String getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
        return formateador.format(ahora);
    }
}
